#ifndef MPHASHUTILS_H
#define MPHASHUTILS_H

/******************************
 *
 * 名   称：   HASH计算类。
 * 用   途：   针对字节数组、文件、字符串的md5、sha1、hmacSha1计算
 * 作用范围：   公共的
 * 创建时间：   2022-10-03
 * 备   注：
 * 参   考：   主要基于OPENSSL库实现
 *
 ******************************/

//#define MP_HASH_USE_BOOST
// 注意boost实现中没有hmacSha1的实现

#include <string>
#include "string.h"

namespace MP{
namespace HashUtils{

///**
// * @brief 将十六进制字符串转换为二进制值(??? 该函数测试有问题)
// * @param str_hex
// * @param str_bin
// * @return
// */
//bool hexStringToBin(const std::string& str_hex, std::string & str_bin);

bool bytes_md5_hex(const unsigned char *data, size_t length, std::string & str_md5);
bool bytes_sha1_hex(const unsigned char *data, size_t length, std::string & str_sha1);
bool bytes_hmacSha1_hex(const unsigned char *data, size_t data_length, const unsigned char *key,size_t key_length, std::string & str_hmacSha1);

/**
 * @brief 计算文本的MD5(16进制Hex值)
 * @param text 文本内容（输入）
 * @param str_md5 MD5（输出）
 * @return 是否计算成功
 */
bool text_md5_hex(const std::string & text, std::string & str_md5);
/**
 * @brief 计算文本的SHA1(16进制Hex值)
 * @param text 文本内容（输入）
 * @param str_sha1 SHA1（输出）
 * @return 是否计算成功
 */
bool text_sha1_hex(const std::string & text, std::string & str_sha1);

/**
 * @brief 计算文本的hmacSha1(16进制Hex值)
 * @param text
 * @param key
 * @param str_hmacSha1
 * @return
 */
bool text_hmacSha1_hex(const std::string & text, const std::string & key, std::string & str_hmacSha1);

/**
 * @brief 计算文件的MD5(16进制Hex值)
 * @param text 文件路径（输入）
 * @param str_md5 MD5（输出）
 * @return 是否计算成功
 */
bool file_md5_hex(const std::string & filePath, std::string & str_md5);
bool file_md5_hex(const std::string & filePath,
                  std::size_t _fileOffset,
                  std::size_t _sendContentSize,
                  std::string & str_md5);

/**
 * @brief 计算文本的SHA1(16进制Hex值)
 * @param text 文件路径（输入）
 * @param str_sha1 SHA1（输出）
 * @return 是否计算成功
 */
bool file_sha1_hex(const std::string & filePath, std::string & str_sha1);
/**
 * @brief 计算文件的CRC64值
 * @param filePath
 * @return
 */
uint64_t file_crc64(const std::string & filePath);

}   //END HashUtils
}   //END MP

#endif // MPHASHUTILS_H
